home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 February: Tool Chest / Dev.CD Feb 97 TC.toast / Sample Code / Interapplication Communication / 7Edit 3.1 / Sources / SVAEMove.c < prev    next >
Encoding:
Text File  |  1995-11-20  |  4.5 KB  |  178 lines  |  [TEXT/CWIE]

  1. // SVAEMove.c
  2. //
  3. // 7Edit 3.1d1. Original version by Jon Lansdell and Nigel Humphreys.
  4. // 3.1 updates by Greg Sutton.
  5. // Â©Apple Computer Inc 1995, all rights reserved.
  6.  
  7. #include "SVAEMove.h"
  8.  
  9. #include "SVEditAEUtils.h"
  10. #include "SVEditWindow.h"        // for DPtrFromWindowPtr()
  11. #include "SVAETextUtils.h"
  12.  
  13. #include "SVAEDelete.h"
  14. #include "SVAECreate.h"
  15. #include "SVAEGetData.h"
  16.  
  17.  
  18. #pragma segment AppleEvent
  19.  
  20.  
  21. pascal OSErr    DoMove(const AppleEvent *theAppleEvent, AppleEvent *reply, long  handlerRefCon)
  22. {
  23. #pragma unused(handlerRefCon)
  24.  
  25.     AEDesc        directObj = {typeNull, NULL},
  26.                 insertHereDesc = {typeNull, NULL},
  27.                 resultDesc = {typeNull, NULL};
  28.     OSErr        err;
  29.  
  30.     err = AEGetParamDesc(theAppleEvent, keyDirectObject, typeWildCard, &directObj);
  31.     if (noErr != err) goto done;
  32.  
  33.     err = AEGetParamDesc(theAppleEvent, keyAEInsertHere, typeWildCard, &insertHereDesc);
  34.     if (noErr != err) goto done;
  35.  
  36.         // missing any parameters?
  37.     err = GotRequiredParams(theAppleEvent);
  38.     if (noErr != err) goto done;
  39.     
  40.     err = MoveDesc(&directObj, &insertHereDesc, &resultDesc);
  41.     if (noErr != err) goto done;
  42.     
  43.     err = AddResultToReply(&resultDesc, reply, err);
  44.  
  45. done:
  46.     if (directObj.dataHandle)
  47.         AEDisposeDesc(&directObj);
  48.     if (insertHereDesc.dataHandle)
  49.         AEDisposeDesc(&insertHereDesc);
  50.         
  51.     return(err);
  52. }
  53.  
  54. OSErr    MoveTextToken(TextToken* token, AEDesc* insertHereDesc, AEDesc* result)
  55. {
  56.     TextToken        insertAtToken;
  57.     AEDesc            dataDesc = {typeNull, NULL},
  58.                     insertDesc = {typeNull, NULL},
  59.                     propertyDesc = {typeNull, NULL};    // Use to pass no properties
  60.     DescType        insertType;
  61.     short            numPartial;
  62.     OSErr            err;
  63.  
  64.                         // Get the data descriptor to insert
  65.     err = GetTextTextProperty(token, &dataDesc);
  66.     if (noErr != err) goto done;
  67.  
  68.                         // Get the place to insert it
  69.      err = GetInsertDescFromInsertHere(insertHereDesc, &insertDesc, &insertType);
  70.     if (noErr != err) goto done;
  71.     
  72.     if (typeNull == insertType)        // Default to setting the selection in the front window
  73.         err = errAETypeError;        // GetWindowSelection(FrontWindow(), &insertAtToken, &oldLength);
  74.     else                            // Otherwise get a selection from the insertDesc
  75.         err = GetInsertToken(&insertDesc, insertType, &insertAtToken);
  76.         
  77.     if (noErr != err) goto done;
  78.     
  79.                         // Sort out any moving onto self scenarios
  80.                         // and offsets changing due to deletion of where it was
  81.     switch (TokenWithinToken(token, &insertAtToken, &numPartial))
  82.     {
  83.         case kTokenBefore:
  84.                     // Do Nothing
  85.             break;
  86.  
  87.         case kTokenAfter:
  88.                     // Balance up for delete
  89.             insertAtToken.tokenOffset -= token->tokenLength;
  90.             break;
  91.             
  92.         case kTokenWithin:
  93.                     //    tell document 1 of application "7Edit"
  94.                     //        move first word to last character of first word
  95.                     //    end tell
  96.             insertAtToken.tokenOffset = token->tokenOffset;
  97.             insertAtToken.tokenLength = 0;
  98.             break;
  99.  
  100.         case kTokenPartialBefore:
  101.             insertAtToken.tokenLength -= numPartial;
  102.             break;
  103.             
  104.         case kTokenPartialAfter:
  105.             insertAtToken.tokenOffset = token->tokenOffset;
  106.             insertAtToken.tokenLength -= numPartial;
  107.             break;
  108.     }
  109.     
  110.                 // Delete the text to be moved
  111.     err = DeleteTextToken(token);
  112.     if (noErr != err) goto done;
  113.     
  114.                 // Secondly create the text wherever
  115.     err = CreateAtTextToken(cText, &dataDesc, &insertAtToken, &propertyDesc, result);
  116.     if (noErr != err) goto done;
  117.  
  118. done:
  119.     if (dataDesc.dataHandle)
  120.         AEDisposeDesc(&dataDesc);
  121.  
  122.     return(err);
  123. }
  124.  
  125. OSErr    MoveTextDesc(AEDesc* textDesc, AEDesc* insertHereDesc, AEDesc* result)
  126. {
  127.     TextToken        aTextToken;
  128.     Size            actualSize;
  129.     OSErr            err;
  130.  
  131.     if (typeMyText != textDesc->descriptorType)
  132.         return(errAETypeError);
  133.         
  134.     GetRawDataFromDescriptor(textDesc, (Ptr)&aTextToken, sizeof(aTextToken), &actualSize);
  135.     
  136.     err = MoveTextToken(&aTextToken, insertHereDesc, result);
  137.     
  138.     return(err);
  139. }
  140.  
  141. OSErr    MoveDesc(AEDesc* aDesc, AEDesc* insertHereDesc, AEDesc* result)
  142. {
  143.     AEDesc        moveDesc = {typeNull, NULL},
  144.                 textDesc = {typeNull, NULL};
  145.     OSErr        err;
  146.     
  147.     if (typeObjectSpecifier == aDesc->descriptorType)
  148.         err = AEResolve(aDesc, kAEIDoMinimum, &moveDesc);
  149.     else
  150.         err = AEDuplicateDesc(aDesc, &moveDesc);
  151.         
  152.     if (noErr != err) goto done;
  153.     
  154.     switch (moveDesc.descriptorType)
  155.     {
  156.         case typeAEList:
  157.             err = errAETypeError;
  158.             // We can't handle moving more than one item because as
  159.             // soon as one item is moved all the rest of the tokens
  160.             // are likely to have their offsets messed up.
  161.             // No doubt it can be done though…
  162.             break;
  163.             
  164.         default:
  165.             err = AECoerceDesc(&moveDesc, typeMyText, &textDesc);
  166.             if (noErr != err) goto done;
  167.             err = MoveTextDesc(&textDesc, insertHereDesc, result);
  168.     }
  169.     
  170. done:
  171.     if (moveDesc.dataHandle)
  172.         AEDisposeDesc(&moveDesc);
  173.     if (textDesc.dataHandle)
  174.         AEDisposeDesc(&textDesc);
  175.     
  176.     return(err);
  177. }
  178.